package org.funtester.performance.books.chapter02.section6;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 自定义多线程同步类
 */
public class FunPhaser {

    /**
     * 任务总数索引,用于标记任务完成状态
     * 注册增加,任务完成减少
     */
    AtomicInteger index;

    /**
     * 任务总数,用于记录任务完成数量
     */
    AtomicInteger taskNum;

    public FunPhaser() {
        this.index = new AtomicInteger();// 初始化
        this.taskNum = new AtomicInteger();// 初始化
    }

    /**
     * 注册任务,并返回当前注册数量
     * @return
     */
    public int register() {
        return this.index.incrementAndGet();
    }

    /**
     * 任务完成
     * @return
     */
    public void done() {
        this.index.getAndDecrement();
        this.taskNum.getAndIncrement();
    }

    /**
     * 等待所有任务完成
     * @return
     */
    public void await() throws InterruptedException {
        long start = System.currentTimeMillis();
        while (index.get() > 0) {
            if (System.currentTimeMillis() - start > 100000) {// 默认超时时间100秒
                System.out.println(System.currentTimeMillis() - start);
                break;
            }
            Thread.sleep(100);
        }
    }

    /**
     * 等待所有任务完成
     * @param timeout 超时时间,单位毫秒
     * @return
     */
    public void await(int timeout) throws InterruptedException {
        long start = System.currentTimeMillis();
        while (index.get() > 0) {
            if (System.currentTimeMillis() - start >= timeout) {
                break;
            }
            Thread.sleep(100);
        }
    }

    /**
     * 获取注册总数
     * @return
     */
    public int queryRegisterNum() {
        return index.get();
    }

    /**
     * 获取任务完成总数
     * @return
     */
    public int queryTaskNum() {
        return taskNum.get();
    }

}
